//Problem Id:1018  User Id:tq 
//Memory:104K  Time:3125MS
//Language:C++  Result:Accepted

/*
author: TangQiao @ Wind 

	problem name:  Moving Object Recognition
	source :	BNU Online Judge
	problem type:  图论题,染色法.
	problem description: 从N张图片中找出体积最大的物体,计算它的移动速度.
	
	problem solution: 计算方法是找出每张图最大物体的质心(即所有点的X坐标的平均,Y坐标的平均),然后
	规定有N张图,N为even, 计算时,第1张图和第N/2 +1 张图相减求一个速度,最后所N/2个
	速度求平均即为最后答案.

	award & note :  此题在染色时不能用递归函数的调用,因为此题的数据深度过大,会使程序递归时
	自动建立的栈满,所以只能手工建栈.用程序来模拟建栈的过程.我开始就是因为这样才最后两个测试
	数据使终过不了.
		我还犯了一个错误,在标记时为了输出到屏幕好查错,我这样标记:
		tot=sign(a, b, number+'0', cx, cy);	这样的话,
		有可能 number+'0'=='x' !!		因为'0'==48,'x'==120
		这样使我最后一个测试数据使终出错.
		把它改成:tot=sign(a, b, number+'x', cx, cy);
		或者,干脆改成:tot=sign(a, b, 1, cx, cy);就通过了.

		最后发现手工建的栈深度只要30即可,真是不可意义!!
	date : 2005.7.8   7.2练习赛后未完成的题补做
	
*/

#include <stdio.h>
#include <string.h>
#define MAX 30
int m,k;

char map[260][260];
int num;
int list[MAX][2];


int findone(int &a, int &b)
{
	int i,j;
	for (i=1;i<=k;i++)
		for (j=0;j<m;j++)
			if (map[i][j]=='x')
			{
				a=i;
				b=j;
				return 1;
			}
	return 0;
}

int  sign(int a,int b,int s, double &mx, double &my)
{

	int top;
	int movex[]={0,0,1,-1};
	int movey[]={1,-1,0,0};
	int i,x,y,tox,toy;
	int tot;
	double totx=0,toty=0;
	
	list[1][0]=a;
	list[1][1]=b;
	top=1;
	tot=0;
	while (top>0)
	{		
		x=list[top][0];
		y=list[top][1];
		top--;
		for (i=0;i<4;i++)
		{
			tot++;
			totx+=x;
			toty+=y;
			map[x][y]=s;

			tox=x+movex[i];
			toy=y+movey[i];
			if (map[tox][toy]=='x')
				if (tox>0 && tox<=k	&& toy>=0 && toy<m)
				{
					top++;
					if (top>=MAX) printf("error!");
					list[top][0]=tox;
					list[top][1]=toy;
					
				}
		}

	}
	
	mx=totx/tot;
	my=toty/tot;
	return tot;
	
}



void find(double &x, double &y)
{	
	int a,b;
	int number,tot,max;
	double cx,cy;
	

	number=0;
	max=0;
	while (findone(a,b))
	{
		number++;
		tot=sign(a, b, 1, cx, cy);	
		if (tot>max)
		{
			max=tot;
			x=cx;
			y=cy;
		}
	}
/*	for (i=1;i<=k;i++)
	{
		for (j=0;j<m;j++)
			printf("%c",map[i][j]);
		printf("\n");
	}
*/
}

main()
{
	char s[560];
	double state[300][2];
	double anx,any;
	
	int  num_map;
	int  i,j;

//	freopen("input", "r", stdin);


	while (1)
	{
		scanf("%d%d", &m, &k);

		if (m==0 && k==0) break;
		
		num_map=0; // init

		memset(map,'.',sizeof(map));
		memset(state,0,sizeof(state));
		for (i=1;i<=k;i++)  //行是从1到K,列是从0到M
			scanf("%s", map[i]);
		num_map++;
		find(state[num_map][0],state[num_map][1]);

		scanf("%s", s);
		memset(map,'.',sizeof(map));
		for (i=1;i<=k;i++)
			scanf("%s", map[i]);
		num_map++;
		find(state[num_map][0],state[num_map][1]);

		scanf("%s", s);

		while (s[0]=='-') 
		{
			memset(map,'.',sizeof(map));
			for (i=1;i<=k;i++)
				scanf("%s", map[i]);
			num_map++;
			find(state[num_map][0],state[num_map][1]);
			scanf("%s", s);
		}
		
		j=num_map/2;  // count for output
		anx=0;
		any=0;
		for (i=1;i<=j;i++)
		{
			anx+=(state[i+j][1]-state[i][1])/j;
			any+=(state[i+j][0]-state[i][0])/j;
		}

		anx/=j;
		any/=j;
		printf("%.2lf %.2lf\n", anx, any);

	}  // end of while (1) 

	return 0;
}
